#pragma once
#include "Constant.h"
#include <cmath>
#include <iostream>
#include <iomanip>

using namespace std;

// 坐标结构体
struct XYZ { double x, y, z; };
struct BLH { double B, L, H; };  // B:纬度(度), L:经度(度), H:高程(m)
struct ENU { double e, n, u; };  // e:东向, n:北向, u:天顶方向

// 坐标系统基类
class CoordSys {
public:
    CoordSys();
    explicit CoordSys(const RefEllip& ellip);

    // 坐标转换函数
    XYZ BLH2XYZ(const BLH& blh) const;
    BLH XYZ2BLH(const XYZ& xyz) const;
    ENU XYZ2ENU(const XYZ& origin, const XYZ& point) const;
    Azel get_azel(XYZ rr, XYZ rs); /*计算接收机到卫星的方位角和高程角，rr为接收机高斯坐标，rs为卫星高斯坐标 */
    // 向量计算函数
    XYZ subtract(const XYZ& a, const XYZ& b) const;
    double mod(const XYZ& xyz) const;
public:
    void test();/* 用于测试本类，在控制台显示结果 */

protected:
    RefEllip ellip;     // 参考椭球体
    double e2;          // 第一偏心率的平方
};

// BDCS坐标系类
class BDCS : public CoordSys {
public:
    BDCS();
    BDCS(RefEllip ellip);
};

// WGS84坐标系类
class WGS84 : public CoordSys {
public:
    WGS84();
    WGS84(RefEllip ellip);
};